// 说明：16 个 clock 发送一个 bit, 一个起始位,8 个数据位,一个校验位,一个停止位
module TXD(clk,bps_clk,rst,datain,wrsig,idle,tx);
input clk; 				 //UART时钟，16倍频1bit
input rst;  
input bps_clk;
input [7:0] datain;	
input wrsig;  			//线路状态指示，高为线路忙，低为线路空闲
output tx;				//发送数据信号
output idle;
reg idle,tx;
reg send;
reg wrsigbuf,wrsigrise;
reg presult;			//奇偶校验位
reg [7:0] cnt; 		//计数器

/////////////////////
//检测发送信号wrsig的上升沿
always@(posedge clk)
begin
	wrsigbuf <= wrsig;
	wrsigrise<= (~wrsigbuf)&wrsig;
end 

/////////////////////
//启动串口发送程序
always@(posedge clk)
begin
	if(wrsigrise &&(~idle)) //发送命令有效且线路空闲，启动新数据发送
	begin
		send<=1'b1;
	end
	else if(cnt ==8'd168) //一帧数据发送结束
	begin
		send<=1'b0;
	end
end

///////////////////////
//串口发送程序，16个clk发送一个bit
///////////////////////
always@(posedge clk or negedge rst)
begin
	if(!rst)
	begin
		tx<=1'b0;
		idle<=1'b0; //线空闲
		cnt<=8'd0;
		presult<=1'b0;		
	end
	else if(send==1'b1)begin
		case(cnt)
		8'd0:begin	//产生起始位，发送信号由高变低，idle为高电平，线繁忙
			tx<=1'b0;
			idle<=1'b1;
			cnt<=cnt+3'd1;
		end
		8'd16,8'd32,8'd48,8'd64,8'd80,8'd96,8'd112,8'd128:
		if(bps_clk)begin
			tx<=datain[(cnt/16)-1]; //发送第0位数据
			presult<=datain[(cnt/16)-1]^1'b0;
			idle<=1'b1;
			cnt<=cnt+8'd1;
		end
		8'd144:if(bps_clk)begin
			tx<=presult; //发送奇偶校验位
			idle<=1'b1;
			cnt<=cnt+8'd1;
		end
		8'd160:if(bps_clk)begin
			tx<=1'b1; //发送停止位
			idle<=1'b1;
			cnt<=cnt+8'd1;
		end
		8'd168:begin
			tx<=1'b1; 
			idle<=1'b0;		//一帧数据发送结束		
			cnt<=cnt+8'd1;
		end
		endcase
	end
	else begin 
		tx<=1'b1;	//停止发送
		cnt <=8'd0;	
		idle<=1'b0;	//空闲
	end
end


endmodule
